{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "0ab2678d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import seaborn as sns\n",
    "import re\n",
    "import cv2\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.feature_extraction import text\n",
    "from sklearn.metrics import mean_squared_error, confusion_matrix\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV, KFold\n",
    "from sklearn.linear_model import LinearRegression, LogisticRegression\n",
    "from sklearn.metrics import classification_report\n",
    "from sklearn.linear_model import SGDRegressor\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.naive_bayes import ComplementNB\n",
    "# import tensorflow as tf\n",
    "import imblearn\n",
    "from imblearn.over_sampling import SMOTE\n",
    "stopwords = text.ENGLISH_STOP_WORDS"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b8d57fb4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Unnamed: 0</th>\n",
       "      <th>id</th>\n",
       "      <th>tweets</th>\n",
       "      <th>name</th>\n",
       "      <th>screen_name</th>\n",
       "      <th>description</th>\n",
       "      <th>img_path</th>\n",
       "      <th>is_female</th>\n",
       "      <th>year_born</th>\n",
       "      <th>race</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>12488</td>\n",
       "      <td>['YKAR, a futuristic sans serif font by @Emmer...</td>\n",
       "      <td>Chad Boyce</td>\n",
       "      <td>djsnipa1</td>\n",
       "      <td>Multimedia Developer, Graphic Designer, DJ, an...</td>\n",
       "      <td>profile pics/60147.jpeg</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1980.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>719703</td>\n",
       "      <td>['In other words, it’s good news about the vac...</td>\n",
       "      <td>Tomato 😷</td>\n",
       "      <td>Tomato</td>\n",
       "      <td>🇭🇰Rise Up!</td>\n",
       "      <td>profile pics/60148.jpeg</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1985.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>749003</td>\n",
       "      <td>['would it be fair to call lil nas x the first...</td>\n",
       "      <td>A ring made from a spoon --- E83.31</td>\n",
       "      <td>IYQbd</td>\n",
       "      <td>Has the kind of luck that turns a professional...</td>\n",
       "      <td>profile pics/60150.jpeg</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1982.0</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>822540</td>\n",
       "      <td>['@Asmongold ❤️ 🙏', '@Hunter4J @Wario64 bonk',...</td>\n",
       "      <td>parker</td>\n",
       "      <td>parker</td>\n",
       "      <td>gotta go fast</td>\n",
       "      <td>profile pics/60153.jpeg</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1979.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>865071</td>\n",
       "      <td>['@robo_james How about pizza dipped in water ...</td>\n",
       "      <td>Kevin Jones</td>\n",
       "      <td>kevinj</td>\n",
       "      <td>NaN</td>\n",
       "      <td>profile pics/60154.jpeg</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1995.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Unnamed: 0      id                                             tweets  \\\n",
       "0           0   12488  ['YKAR, a futuristic sans serif font by @Emmer...   \n",
       "1           1  719703  ['In other words, it’s good news about the vac...   \n",
       "2           2  749003  ['would it be fair to call lil nas x the first...   \n",
       "3           3  822540  ['@Asmongold ❤️ 🙏', '@Hunter4J @Wario64 bonk',...   \n",
       "4           4  865071  ['@robo_james How about pizza dipped in water ...   \n",
       "\n",
       "                                  name screen_name  \\\n",
       "0                           Chad Boyce    djsnipa1   \n",
       "1                             Tomato 😷      Tomato   \n",
       "2  A ring made from a spoon --- E83.31       IYQbd   \n",
       "3                               parker      parker   \n",
       "4                          Kevin Jones      kevinj   \n",
       "\n",
       "                                         description                 img_path  \\\n",
       "0  Multimedia Developer, Graphic Designer, DJ, an...  profile pics/60147.jpeg   \n",
       "1                                         🇭🇰Rise Up!  profile pics/60148.jpeg   \n",
       "2  Has the kind of luck that turns a professional...  profile pics/60150.jpeg   \n",
       "3                                      gotta go fast  profile pics/60153.jpeg   \n",
       "4                                                NaN  profile pics/60154.jpeg   \n",
       "\n",
       "   is_female  year_born  race  \n",
       "0        0.0     1980.0   4.0  \n",
       "1        0.0     1985.0   4.0  \n",
       "2        0.0     1982.0   5.0  \n",
       "3        0.0     1979.0   4.0  \n",
       "4        0.0     1995.0   4.0  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv(\"data_race_pred.csv\")\n",
    "data[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "656ee9db",
   "metadata": {},
   "outputs": [],
   "source": [
    "def preprocess(data):\n",
    "    t = data\n",
    "    t = t.lower() # lower letters\n",
    "    t = re.sub(r'http\\S+', '', t) # remove HTTP links\n",
    "    t = re.sub(r'@[^\\s]+', '', t) # remove usernames\n",
    "    t = re.sub(r'#[^\\s]+', '', t) # remove hashtags\n",
    "    t = re.sub(r'([\\'\\\"\\.\\(\\)\\!\\?\\\\\\/\\,])', r' \\1 ', t)\n",
    "    t = re.sub(r'[^\\w\\s\\?]', '', t) # remove punctuations except ?\n",
    "    t = ' '.join([word for word in t.split() if word not in stopwords]) # remove stopwords\n",
    "    return t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "2df40afd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Unnamed: 0</th>\n",
       "      <th>id</th>\n",
       "      <th>tweets</th>\n",
       "      <th>name</th>\n",
       "      <th>screen_name</th>\n",
       "      <th>description</th>\n",
       "      <th>img_path</th>\n",
       "      <th>is_female</th>\n",
       "      <th>year_born</th>\n",
       "      <th>race</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>12488</td>\n",
       "      <td>ykar futuristic sans serif font contact rude p...</td>\n",
       "      <td>Chad Boyce</td>\n",
       "      <td>djsnipa1</td>\n",
       "      <td>Multimedia Developer, Graphic Designer, DJ, an...</td>\n",
       "      <td>profile pics/60147.jpeg</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1980.0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>719703</td>\n",
       "      <td>words good news vaccines safety media misrepre...</td>\n",
       "      <td>Tomato 😷</td>\n",
       "      <td>Tomato</td>\n",
       "      <td>🇭🇰Rise Up!</td>\n",
       "      <td>profile pics/60148.jpeg</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1985.0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>822540</td>\n",
       "      <td>bonk nice ed mcboy oos getting real tired game...</td>\n",
       "      <td>parker</td>\n",
       "      <td>parker</td>\n",
       "      <td>gotta go fast</td>\n",
       "      <td>profile pics/60153.jpeg</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1979.0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>7</td>\n",
       "      <td>1143891</td>\n",
       "      <td>piano transcription adagietto mahler 5th littl...</td>\n",
       "      <td>Ian Hsu</td>\n",
       "      <td>IanHsu</td>\n",
       "      <td>Proud papa, intrepid explorer, loves slow-cook...</td>\n",
       "      <td>profile pics/60157.jpeg</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1976.0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>8</td>\n",
       "      <td>1191741</td>\n",
       "      <td>tell em n n levar burton longer interested hos...</td>\n",
       "      <td>~JOSh-X</td>\n",
       "      <td>lightmanx5</td>\n",
       "      <td>if BlackLives.Matter then AllLives.Matter = T;...</td>\n",
       "      <td>profile pics/60158.jpeg</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1973.0</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Unnamed: 0       id                                             tweets  \\\n",
       "0           0    12488  ykar futuristic sans serif font contact rude p...   \n",
       "1           1   719703  words good news vaccines safety media misrepre...   \n",
       "3           3   822540  bonk nice ed mcboy oos getting real tired game...   \n",
       "7           7  1143891  piano transcription adagietto mahler 5th littl...   \n",
       "8           8  1191741  tell em n n levar burton longer interested hos...   \n",
       "\n",
       "         name screen_name                                        description  \\\n",
       "0  Chad Boyce    djsnipa1  Multimedia Developer, Graphic Designer, DJ, an...   \n",
       "1    Tomato 😷      Tomato                                         🇭🇰Rise Up!   \n",
       "3      parker      parker                                      gotta go fast   \n",
       "7     Ian Hsu      IanHsu  Proud papa, intrepid explorer, loves slow-cook...   \n",
       "8     ~JOSh-X  lightmanx5  if BlackLives.Matter then AllLives.Matter = T;...   \n",
       "\n",
       "                  img_path  is_female  year_born  race  \n",
       "0  profile pics/60147.jpeg        0.0     1980.0     4  \n",
       "1  profile pics/60148.jpeg        0.0     1985.0     4  \n",
       "3  profile pics/60153.jpeg        0.0     1979.0     4  \n",
       "7  profile pics/60157.jpeg        0.0     1976.0     3  \n",
       "8  profile pics/60158.jpeg        0.0     1973.0     4  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.replace([np.inf, -np.inf], np.nan, inplace=True)\n",
    "data = data.dropna()\n",
    "data[\"race\"] = data[\"race\"].astype(int)\n",
    "data = data.drop(data[data[\"race\"] == 5].index)\n",
    "data[\"tweets\"] = data[\"tweets\"].apply(preprocess)\n",
    "data[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "a6d12d0b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4    1889\n",
       "1     236\n",
       "2     153\n",
       "3      75\n",
       "Name: race, dtype: int64"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data[\"race\"].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0d8be33f",
   "metadata": {},
   "source": [
    "# Try Muiltiple Models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "2caaf833",
   "metadata": {},
   "outputs": [],
   "source": [
    "tfidf = TfidfVectorizer(max_features = 7500, ngram_range=(1,2))\n",
    "X = tfidf.fit_transform(data['tweets'])\n",
    "y = data['race']\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/4.0, random_state=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "1af3cebd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{1, 2, 3, 4}\n"
     ]
    }
   ],
   "source": [
    "reg = LinearRegression().fit(X_train, y_train)\n",
    "y_pred = reg.predict(X_test)\n",
    "\n",
    "y_pred = [round(x) for x in y_pred] \n",
    "for index in range(len(y_pred)): \n",
    "    if y_pred[index] < 1:\n",
    "        y_pred[index] = 1\n",
    "    if y_pred[index] > 4:\n",
    "        y_pred[index] = 4\n",
    "\n",
    "print(set(y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "07c8a127",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           1       0.33      0.04      0.06        57\n",
      "           2       0.18      0.29      0.22        35\n",
      "           3       0.04      0.40      0.07        20\n",
      "           4       0.89      0.59      0.71       477\n",
      "\n",
      "    accuracy                           0.51       589\n",
      "   macro avg       0.36      0.33      0.27       589\n",
      "weighted avg       0.77      0.51      0.60       589\n",
      "\n",
      "RMSE on testing set =  1.0305602716468591\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(classification_report(y_test, y_pred))\n",
    "\n",
    "print(\"RMSE on testing set = \", mean_squared_error(y_test, y_pred))\n",
    "\n",
    "# Plot a confusion matrix\n",
    "cm = confusion_matrix(y_test, y_pred, normalize='true')\n",
    "sns.heatmap(cm, annot=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b040847e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{1, 4}\n"
     ]
    }
   ],
   "source": [
    "log = LogisticRegression(multi_class='multinomial', solver='lbfgs').fit(X_train, y_train)\n",
    "y_pred = log.predict(X_test)\n",
    "\n",
    "y_pred = [round(x) for x in y_pred] \n",
    "for index in range(len(y_pred)): \n",
    "    if y_pred[index] < 1:\n",
    "        y_pred[index] = 1\n",
    "    if y_pred[index] > 4:\n",
    "        y_pred[index] = 4\n",
    "\n",
    "print(set(y_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "c1bd3b1d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           1       0.75      0.05      0.10        57\n",
      "           2       0.00      0.00      0.00        35\n",
      "           3       0.00      0.00      0.00        20\n",
      "           4       0.82      1.00      0.90       477\n",
      "\n",
      "    accuracy                           0.81       589\n",
      "   macro avg       0.39      0.26      0.25       589\n",
      "weighted avg       0.73      0.81      0.74       589\n",
      "\n",
      "RMSE on testing set =  1.0916808149405772\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/anaconda3/lib/python3.8/site-packages/sklearn/metrics/_classification.py:1308: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n",
      "/opt/anaconda3/lib/python3.8/site-packages/sklearn/metrics/_classification.py:1308: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n",
      "/opt/anaconda3/lib/python3.8/site-packages/sklearn/metrics/_classification.py:1308: UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, msg_start, len(result))\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(classification_report(y_test, y_pred))\n",
    "\n",
    "print(\"RMSE on testing set = \", mean_squared_error(y_test, y_pred))\n",
    "\n",
    "# Plot a confusion matrix\n",
    "cm = confusion_matrix(y_test, y_pred, normalize='true')\n",
    "sns.heatmap(cm, annot=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "69774054",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{2, 3}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "set(y_test) - set(y_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "4a3cc3e4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# naive Bayes\n",
    "clf = ComplementNB().fit(X_train, y_train)\n",
    "y_pred = clf.predict(X_test)\n",
    "\n",
    "y_pred = [round(x) for x in y_pred] \n",
    "for index in range(len(y_pred)): \n",
    "    if y_pred[index] < 1:\n",
    "        y_pred[index] = 1\n",
    "    if y_pred[index] > 4:\n",
    "        y_pred[index] = 4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "5902390b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           1       0.37      0.12      0.18        57\n",
      "           2       0.06      0.03      0.04        35\n",
      "           3       0.10      0.10      0.10        20\n",
      "           4       0.82      0.91      0.86       477\n",
      "\n",
      "    accuracy                           0.76       589\n",
      "   macro avg       0.34      0.29      0.30       589\n",
      "weighted avg       0.71      0.76      0.72       589\n",
      "\n",
      "RMSE on testing set =  1.2648556876061121\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(classification_report(y_test, y_pred))\n",
    "\n",
    "print(\"RMSE on testing set = \", mean_squared_error(y_test, y_pred))\n",
    "\n",
    "# Plot a confusion matrix\n",
    "cm = confusion_matrix(y_test, y_pred, normalize='true')\n",
    "sns.heatmap(cm, annot=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3ad661d0",
   "metadata": {},
   "source": [
    "# Apply Oversampling"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "431ab7a2",
   "metadata": {},
   "outputs": [],
   "source": [
    "X = tfidf.fit_transform(data['tweets'])\n",
    "y = data['race']\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/4.0, random_state=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "56f25783",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4    1412\n",
      "2    1412\n",
      "1    1412\n",
      "3    1412\n",
      "Name: race, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "oversample = SMOTE()\n",
    "X_train, y_train = oversample.fit_resample(X_train, y_train)\n",
    "print(y_train.value_counts())\n",
    "log = LogisticRegression(multi_class='multinomial', solver='lbfgs').fit(X_train, y_train)\n",
    "y_pred = log.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "f115bf43",
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred = [round(x) for x in y_pred] \n",
    "for index in range(len(y_pred)): \n",
    "    if y_pred[index] < 1:\n",
    "        y_pred[index] = 1\n",
    "    if y_pred[index] > 4:\n",
    "        y_pred[index] = 4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "fb45a9ca",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           1       0.39      0.49      0.44        57\n",
      "           2       0.28      0.20      0.23        35\n",
      "           3       0.00      0.00      0.00        20\n",
      "           4       0.87      0.90      0.89       477\n",
      "\n",
      "    accuracy                           0.79       589\n",
      "   macro avg       0.39      0.40      0.39       589\n",
      "weighted avg       0.76      0.79      0.77       589\n",
      "\n",
      "RMSE on testing set =  1.2359932088285228\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(classification_report(y_test, y_pred))\n",
    "print(\"RMSE on testing set = \", mean_squared_error(y_test, y_pred))\n",
    "\n",
    "# Plot a confusion matrix\n",
    "cm = confusion_matrix(y_test, y_pred, normalize='true')\n",
    "sns.heatmap(cm, annot=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "56e5c572",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           1       0.35      0.53      0.42        57\n",
      "           2       0.20      0.23      0.21        35\n",
      "           3       0.12      0.20      0.15        20\n",
      "           4       0.88      0.79      0.84       477\n",
      "\n",
      "    accuracy                           0.71       589\n",
      "   macro avg       0.39      0.44      0.40       589\n",
      "weighted avg       0.76      0.71      0.73       589\n",
      "\n",
      "RMSE on testing set =  1.4855687606112054\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# naive Bayes\n",
    "clf = ComplementNB().fit(X_train, y_train)\n",
    "y_pred = clf.predict(X_test)\n",
    "\n",
    "y_pred = [round(x) for x in y_pred] \n",
    "for index in range(len(y_pred)): \n",
    "    if y_pred[index] < 1:\n",
    "        y_pred[index] = 1\n",
    "    if y_pred[index] > 4:\n",
    "        y_pred[index] = 4\n",
    "\n",
    "print(classification_report(y_test, y_pred))\n",
    "print(\"RMSE on testing set = \", mean_squared_error(y_test, y_pred))\n",
    "\n",
    "# Plot a confusion matrix\n",
    "cm = confusion_matrix(y_test, y_pred, normalize='true')\n",
    "sns.heatmap(cm, annot=True)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
